iT邦幫忙

0

[DAY5] Django與Docker Compose後端開發實戰 - 資料庫結構修改與MariaDB管理最佳實踐

  • 分享至 

  • xImage
  •  

在上一篇文章中,我們學習了如何使用Django Rest Framework(DRF)來創建一個API應用。通過定義模型、序列化器和視圖,並通過JWT進行身份驗證:

[DAY4] Django與Docker Compose後端開發實戰 - 創建一個基於Django-Rest-Framework的應用

本篇文章中,我們將探討在Django項目中修改資料庫的正確作法,包括如何進行數據庫遷移和倒退以及探索MariaDB資料庫內部的一些資訊和使用方法。

Django 修改資料庫的正確作法

修改模型

假設我們需要從UserProfile模型中去除permission_level欄位,首先需要在account/models.py中進行修改:

from django.contrib.auth.models import AbstractUser
from django.db import models

class UserProfile(AbstractUser):
    pass

更新序列化器

接下來,更新account/serializers.py文件,移除permission_level欄位:

from django.contrib.auth import get_user_model
from rest_framework import serializers
from django.contrib.auth.hashers import make_password

User = get_user_model()

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email', 'password')
        extra_kwargs = {
            'password': {'write_only': True, 'required': True}
        }

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data.get('password'))
        return super(UserSerializer, self).create(validated_data)

執行數據庫遷移

更新模型後,需要進行數據庫遷移以應用變更:

docker exec -it backend-api-services python manage.py makemigrations
docker exec -it backend-api-services python manage.py migrate

倒退數據庫版本

如果我們需要倒退數據庫版本,例如從遷移0003回退到0002,可以使用以下命令:

docker exec -it backend-api-services python manage.py migrate account 0002

然後手動刪除0003遷移文件並重啟容器:

docker-compose -f docker-compose-local.yml restart

撤銷所有遷移

如果需要撤銷應用的所有遷移,可以使用以下命令:

docker exec -it backend-api-services python manage.py migrate account zero

這些步驟確保了數據庫結構的變更與代碼保持一致,避免數據庫狀態與應用邏輯不匹配的問題。

MariaDB的使用

在之前的教學中,我們將Django的預設數據庫從SQLite更改為MariaDB,這提供了一個穩定且可擴充的數據存儲方案,特別適合生產環境和大規模應用。MariaDB比SQLite更適合處理大量的同時連接和複雜的查詢,能夠更好地支持高併發和大數據量操作。

存儲數據的位置

數據通常會存儲在容器的卷中,以我們的例子來說,數據存儲在backend-mariadb這個容器的卷中:

volumes:
      - mariadb_data:/var/lib/mysql

訪問數據庫

可以通過進入mariadb容器內部來使用MySQL命令行工具訪問數據庫:

docker exec -it backend-mariadb bash
mysql -u root -p

輸入在yml文件中定義的MYSQL_ROOT_PASSWORD後,可以使用SQL語法來檢視數據庫和進行操作:

SHOW DATABASES;  # 查看所有數據庫
USE your_database_name;  # 選擇某數據庫
SHOW TABLES;  # 顯示當前數據庫的所有表
SELECT * FROM your_table_name;  # 查看表的數據

但是要注意,不建議在容器內部進行數據更改,應在Django中進行更改後進行遷移,以保持應用狀態和數據庫的一致性。

查看數據庫內部結構

進入數據庫後,可以看到如下數據庫:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydatabase         |
| mysql              |
| performance_schema |
+--------------------+

這些數據庫的用途如下:

  • information_schema:一個包含所有其他數據庫元數據的數據庫,讓我們可以查詢它來獲得關於數據庫實例的信息。
  • mysql:運行MariaDB必須的數據,如用戶帳戶信息和權限等。
  • performance_schema:適用於監控MariaDB性能和收集數據庫伺服器性能參數的數據庫。

當我們進入自定義的mydatabase時,可以使用以下命令來查看數據庫中的表:

SHOW TABLES;

顯示的表可能如下所示:

+--------------------------------------+
| Tables_in_mydatabase                 |
+--------------------------------------+
| account_userprofile                  |
| account_userprofile_groups           |
| account_userprofile_user_permissions |
| auth_group                           |
| auth_group_permissions               |
| auth_permission                      |
| django_admin_log                     |
| django_content_type                  |
| django_migrations                    |
| django_session                       |
| hello_hellomodel                     |
+--------------------------------------+

這些表中,authdjango開頭的表是Django自帶的系統表,用於支持各種框架級別的功能如用戶認證、權限管理、會話管理等。

  • account_userprofile:存儲用戶資料的主要表。
  • account_userprofile_groups:用戶和組之間的多對多關係表。
  • account_userprofile_user_permissions:用戶和權限之間的多對多關係表。
  • auth_group:存儲用戶組的表。
  • auth_group_permissions:組和權限之間的多對多關係表。
  • auth_permission:存儲權限的表。
  • django_admin_log:Django管理日誌表。
  • django_content_type:Django內容類型表,用於通過內容類型框架提供泛型關聯。
  • django_migrations:Django遷移歷史表。
  • django_session:存儲會話數據的表。
  • hello_hellomodel:我們在hello應用中定義的模型表。

重新建立資料庫的數據

如果需要重新建立資料庫的數據,可以刪除相應的卷並重新建構容器。首先,查看mariadb的容器名稱或ID:

docker ps

確定容器名稱是backend-mariadb後,查看其相關資訊:

docker inspect backend-mariadb

可以看到有一個Mounts部分,顯示卷的名稱,例如template_mariadb_data。然後停止容器並刪除該卷:

docker-compose down
docker volume rm template_mariadb_data

重新啟動並建構容器:

docker-compose -f docker-compose-local.yml up --build -d

結論

在這篇文章中,我們學習了如何在Django項目中正確地修改資料庫結構,並探討了MariaDB的使用方法。通過進行數據庫遷移和版本回退,我們能夠保持數據庫結構與應用邏輯的一致性。同時,通過使用MariaDB,我們可以更好地支持大規模應用和高併發操作。在下一篇文章中將教會讀者如何建立管理員系統和Swagger API文檔!

[DAY6] Django與Docker Compose後端開發實戰 - 設置Admin管理系統與整合Swagger


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言